/*******************************************************************************
 * Classe SousBombe : classe de création et de gestion des sous-bombes de la
 *                    bombe fertile
 ******************************************************************************/
package Armes;

import java.awt.*;
import java.util.logging.*;
import javax.swing.JOptionPane;
import prjintwg.Jeu;
import ElementsDeJeu.MessageSpecial;
import prjintwg.PnlJeu;

/**
 *
 * @author W&G
 */
public class SousBombe extends BombeFertile {
    //Processus de déplacement des sous-bombes
    ThreadSBDeplacement threadSB = new ThreadSBDeplacement();
    SousBombe sb;//sous bombe actuelle
    static int bombes = 0;//nombre de sous-bombes en déplacement
    boolean touche;//determine si le projectile touche le personnage adverse
    boolean autoTouche;//determine si le projectile touche le meme personnage
    BombeFertile bf;//bombe fertile mère

    /**
     * Constructeur de la sous-bombe
     * @param positionX position de départ en x
     * @param positionY position de départ en y
     * @param pnlJeu panneau du jeu
     * @param vitesseX vitesse de départ en x
     * @param vitesseY vitesse de départ en y
     * @param index
     * @param bf bombe fertile mère
     */
    public SousBombe(int positionX, int positionY, PnlJeu pnlJeu, double vitesseX, double vitesseY, int index, BombeFertile bf) {
        super(positionX, positionY, pnlJeu);
        this.bf = bf;
        touche = false;
        autoTouche = false;
        this.vitesseX = vitesseX;
        this.vitesseY = vitesseY;
        this.setPosition(positionX, positionY);
        this.index = index;
        setSb();
        jeu = pnlJeu.getF().getJeu();
        rayonExplosion = 5;
        puissance = 0.4;
        threadSB.start();
    }
/**
 * Définit la sous-bombe
 */
    private void setSb() {
        sb = this;
    }
/**
 * Retourne si la bombe touche l'adversaire ou non
 * @return retourne si la bombe touche l'adversaire ou non
 */
    public boolean getTouche() {
        return touche;
    }
/**
 * Retourne si la bombe touche le joueur-meme ou non
 * @return Retourne si la bombe touche le joueur-meme ou non
 */
    public boolean getAutoTouche() {
        return autoTouche;
    }
/**
 * Retourne si toutes les bombes sont explosées
 * @return retourne si toutes les bombes sont explosées
 */
    private boolean tousExploses() {
        if (++bombes < 5) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public void paintComponent(Graphics g) {//Dessine les composants
        g.setColor(Color.CYAN);
        g.fillOval(this.positionX, TAILLEFENETRE - this.positionY, 6, 6);
    }
/**
 * Processus de déplacement des sous-bombes
 */
    protected class ThreadSBDeplacement extends Thread {

        @Override
        public void run() {
            try {
                while (!collision(sb) && !touche(pnlJeu.getPersonnage2(), sb) && !touche(pnlJeu.getPersonnage1(), sb)) {
                    pnlJeu.getF().repaint(sb.positionX - 20,
                            pnlJeu.getF().getHeight() - sb.positionY - 20, 60, 60);
                    calculerMouvement();
                    try {
                        sleep(10);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Jeu.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                if (!estEnDehors(sb) && positionY > 0
                        && !touche(pnlJeu.getPersonnage2(), sb) && !touche(pnlJeu.getPersonnage1(), sb)) {
                    jeu.explosion(rayonExplosion, null, sb);
                }
                if (touche(pnlJeu.getPersonnage1(), sb)) {
                    pnlJeu.personnage1Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage2().getForce());

                    if (Jeu.getTourTir() % 2 == 0) {
                        autoTouche = true;
                    } else {
                        touche = true;
                    }
                } else if (touche(pnlJeu.getPersonnage2(), sb)) {
                    pnlJeu.personnage2Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage1().getForce());
                    if (Jeu.getTourTir() % 2 == 1) {
                        autoTouche = true;
                    } else {
                        touche = true;
                    }
                }
                threadExplosion.start();
                pnlJeu.getF().repaint(positionX - 50,
                        pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
                pnlJeu.getBtnDeplacement().setEnabled(true);
                pnlJeu.getCboArmes().setEnabled(true);
                if (tousExploses()) {
                    if (bf.getSb1().getTouche() || bf.getSb2().getTouche() || bf.getSb3().getTouche() || bf.getSb4().getTouche() || bf.getSb5().getTouche()) {
                        try {
                            microphone.playSound("ouch.wav");
                            mS = new MessageSpecial("Ouch.PNG");
                            mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
                    } else if (bf.getSb1().getAutoTouche() || bf.getSb2().getAutoTouche() || bf.getSb3().getAutoTouche() || bf.getSb4().getAutoTouche() || bf.getSb5().getAutoTouche()) {
                        try {
                            microphone.playSound("EpicFail.wav");
                            mS = new MessageSpecial("EpicFail.PNG");
                            mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
                    } else {
                        try {
                            microphone.playSound("Fail.wav");
                            mS = new MessageSpecial("Fail.PNG");
                            mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
                    }

                    if (pnlJeu.getPersonnage1().getPv() <= 0 || pnlJeu.getPersonnage2().getPv() <= 0) {
                        try {
                        pnlJeu.remove(mS);
                        microphone.playSound("Destroyed.wav");
                        mS = new MessageSpecial("Destroyed.PNG");
                        mS.setBounds(300, 100, 440, 160);
                        pnlJeu.add(mS);
                        sleep(1000);
                        switch (JOptionPane.showConfirmDialog(null, "Voulez vous recommencer ?")) {
                            case 0:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                break;
                            case 1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case 2:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case -1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            default:
                                pnlJeu.getBtnDeplacement().setEnabled(false);
                        }
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
                    }
                    pnlJeu.getF().repaint();
                    pnlJeu.nouveauProjectile();
                    try {
                        sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Jeu.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    try {
                        pnlJeu.remove(mS);
                    } catch (Exception e) {
                    }
                    bombes = 0;
                }
                pnlJeu.getMonDecor().setEnJeu(false);
                pnlJeu.getF().repaint();
            } catch (NullPointerException npe) {
            }
        }
    }
}
